// import store from '@/vuex/index'
import XLSX from 'xlsx'
import html2Canvas from 'html2canvas'
// import JsPDF from 'jspdf'
let com = {
  // 时间格式化
  formatDate: (date, fmt) => {
    if (date == null) {
      return ''
    }
    var t = new Date(date)
    var tf = function (i) {
      return (i < 10 ? '0' : '') + i
    }
    return fmt.replace(/yyyy|MM|dd|HH|mm|ss/g, function (a) {
      switch (a) {
        case 'yyyy':
          return tf(t.getFullYear())
        case 'MM':
          return tf(t.getMonth() + 1)
        case 'mm':
          return tf(t.getMinutes())
        case 'dd':
          return tf(t.getDate())
        case 'HH':
          return tf(t.getHours())
        case 'ss':
          return tf(t.getSeconds())
      }
    })
  },
  getTime (date = new Date()) {
    var y = date.getFullYear()
    var m = date.getMonth() + 1
    m = m < 10 ? ('0' + m) : m
    var d = date.getDate()
    d = d < 10 ? ('0' + d) : d
    var h = date.getHours()
    h = h < 10 ? ('0' + h) : h
    var minute = date.getMinutes()
    minute = minute < 10 ? ('0' + minute) : minute
    var second = date.getSeconds()
    second = second < 10 ? ('0' + second) : second
    return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second
  },
  // 获取自然日-始
  startNatureday: () => {
    var date1 = new Date(new Date(new Date().toLocaleDateString()).getTime())
    var startTime = date1.getFullYear() + '-' + ((date1.getMonth() + 1) < 10 ? '0' + (date1.getMonth() + 1) : (date1.getMonth() + 1)) + '-' + (date1.getDate() < 10 ? '0' + date1.getDate() : date1.getDate()) + ' ' + (date1.getHours() < 10 ? '0' + date1.getHours() : date1.getHours()) + ':' + (date1.getMinutes() < 10 ? '0' + date1.getMinutes() : date1.getMinutes()) + ':' + (date1.getSeconds() < 10 ? '0' + date1.getSeconds() : date1.getSeconds())
    return startTime
  },
  // 获取自然日-末
  endNatureday: () => {
    var date2 = new Date(new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1)
    var endTime = date2.getFullYear() + '-' + (date2.getMonth() + 1) + '-' + date2.getDate() + ' ' + date2.getHours() + ':' + date2.getMinutes() + ':' + date2.getSeconds()
    return endTime
  },
  // 获取当前时间
  /**
   * 用法
   * defaultTime("yyyy-MM-dd");
   * defaultTime("yyyy-MM-dd HH:mm:ss");
   **/
  defaultTime: (date, fmt) => {
    if (date == null) {
      return ''
    }
    var time = new Date(date)
    var o = {
      'M+': time.getMonth() + 1, // 月份
      'd+': time.getDate(), // 日
      'H+': time.getHours(), // 小时
      'm+': time.getMinutes(), // 分
      's+': time.getSeconds(), // 秒
      'q+': Math.floor((time.getMonth() + 3) / 3), // 季度
      'S': time.getMilliseconds() // 毫秒
    }
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (time.getFullYear() + '').substr(4 - RegExp.$1.length))
    for (var k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
    }
    return fmt
  },
  /**
   * 千分位
   */
  fmoney: (s, n = 4) => {
    if (!s) s = 0
    // var n = 4
    n = n > 0 && n <= 20 ? n : 2
    // eslint-disable-next-line no-useless-escape
    s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(n) + ''
    // eslint-disable-next-line one-var
    var l = s.split('.')[0].split('').reverse(),
      r = s.split('.')[1]
    var t = ''
    for (var i = 0; i < l.length; i++) {
      t += l[i] + ((i + 1) % 3 === 0 && (i + 1) !== l.length ? ',' : '')
    }
    return t.split('').reverse().join('') + '.' + r
  },
  // 两个浮点数相加
  AddFun: (num1, num2) => {
    var r1, r2, m
    try {
      r1 = num1.toString().split('.')[1].length
    } catch (e) {
      r1 = 0
    }
    try {
      r2 = num2.toString().split('.')[1].length
    } catch (e) {
      r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2))
    // return (num1*m+num2*m)/m;
    return Math.round(num1 * m + num2 * m) / m
  },
  // 两个浮点数相减
  SubFun: (num1, num2) => {
    var r1, r2, m, n
    try {
      r1 = num1.toString().split('.')[1].length
    } catch (e) {
      r1 = 0
    }
    try {
      r2 = num2.toString().split('.')[1].length
    } catch (e) {
      r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2))
    n = (r1 >= r2) ? r1 : r2
    return (Math.round(num1 * m - num2 * m) / m).toFixed(n)
  },
  // 两数相除
  DivFun: (num1, num2) => {
    var t1, t2, r1, r2
    try {
      t1 = num1.toString().split('.')[1].length
    } catch (e) {
      t1 = 0
    }
    try {
      t2 = num2.toString().split('.')[1].length
    } catch (e) {
      t2 = 0
    }
    r1 = Number(num1.toString().replace('.', ''))
    r2 = Number(num2.toString().replace('.', ''))
    return (r1 / r2) * Math.pow(10, t2 - t1)
  },
  // 两数相乘
  MulFun: (num1, num2) => {
    // eslint-disable-next-line one-var
    var m = 0,
      s1 = num1.toString(),
      s2 = num2.toString()
    try {
      m += s1.split('.')[1].length
    } catch (e) {
      console.log(e)
    }
    try {
      m += s2.split('.')[1].length
    } catch (e) { console.log(e) }
    return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
  },
  /** 公用的新增修改回调函数
   * that：this
   * fun 接口
   * params 传参
   * restForms 需要重置的表单
   * susCallbck 成功后回调
   * errCallback错误回调
   */
  AddUpdate: (that, fun, params, restForms, susCallbck, errCallback) => {
    fun(params).then(res => {
      if (res.code === 0) {
        that.$message({
          message: that.DialogTit + '成功！',
          type: 'success',
          duration: 500
        })
        // eslint-disable-next-line no-unused-expressions
        susCallbck ? susCallbck(that) : ''
        that.$refs[restForms].resetFields()
        // Object.assign(that.$data, that.$options.data()); //初始化数据
        // that.listpager({ rows: that.pageSize });
      } else {
        that.$message.error({
          message: res.message || that.DialogTit + '失败！',
          duration: 1000
        })
        // eslint-disable-next-line no-unused-expressions
        errCallback ? errCallback() : ''
      }
    })
  },
  /** *json数组中通过value值获取索引值
   * arr：json数组 var a=[{a:1},{c:1}]
   * json数组检索对象的key值  key=c
   * value检索对象属性值 如 var value=1
   * */
  valueIndex: (arr, key, value) => {
    for (let n in arr) {
      if (arr[n][key] === value) {
        return n
      }
    }
  },
  removeClass: (btnAll, hasClass) => {
    for (let i = 0; i < btnAll.length; i++) {
      if (btnAll[i].classList.value.indexOf(hasClass) >= 0) {
        btnAll[i].classList.remove(hasClass)
      }
    }
  },
  // removeClass2: (btnAll, hasClass, activeClass) => {
  //   for (let i = 0; i < btnAll.length; i++) {
  //     if (btnAll[i].classList.value.indexOf(hasClass) >= 0) {
  //       btnAll[i].classList.remove(activeClass)
  //     }
  //   }
  // },
  addClass: (el, addClass) => {
    el.$el.className += ' ' + addClass
  },
  /**
   * 选中效果且不删除兄弟元素
   *  el :点击对象元素
   * ctiveClass：选中对象Class
   */
  selfActive: (el, activeClass) => {
    let index = el.$el.className.indexOf(activeClass)
    if (index >= 0) {
      el.$el.className = el.$el.className.substring(0, index)
    } else {
      znk.addClass(el, activeClass)
    }
  },
  /** * 选中效果且删除兄弟元素
   * el :点击对象元素
   * activeEl： 所有点击对象元素
   * activeClass：选中对象Class
   * hasClass : 用于筛选自己需要删除的元素
   * 添加回调
   * 删除回调
   */
  active: (el, activeEl, activeClass, hasClass, addCallback, removeCallback) => {
    let btnAll = el.$el.parentNode.getElementsByTagName(activeEl)
    let index = el.$el.className.indexOf(activeClass)
    if (index >= 0) {
      el.$el.className = el.$el.className.substring(0, index)
      // eslint-disable-next-line no-unused-expressions
      removeCallback ? removeCallback(el, btnAll) : ''
    } else {
      znk.removeClass(btnAll, hasClass, activeClass)
      znk.addClass(el, activeClass)
      if (addCallback) {
        addCallback(el, btnAll)
      }
    }
  },
  /**
   * 数组去空
   * arr: 数组
   *  */
  removeEmptyArrayEle: (arr) => {
    for (var i = 0; i < arr.length; i++) {
      if (!arr[i] || arr[i] === undefined || arr[i].length === 0) {
        arr.splice(i, 1)
        i = i - 1 // i - 1 ,因为空元素在数组下标 2 位置，删除空之后，后面的元素位置，删除空之后，后面的元素要向前补位，
        // 这样才能真正去掉空元素,觉得这句可以删掉的连续为空试试，然后思考其中逻辑
      }
    }
    return arr
  },
  /***
   * json 转换为字符串拼接方式
   */
  jsonStr: (arr) => {
    let txt = ''
    for (let item in arr) {
      if (item && (arr[item] !== '' || arr[item] !== null)) {
        txt += item + '=' + arr[item] + '&'
      }
    }
    txt = txt.substr(0, txt.length - 1)
    return txt
  },
  /**
   * 获取select 选中的label值
   * @param {*} arrs  select 列表数组
   * @param {*} selectVal   select 选中的值
   * @param {*} value select 选中的value值绑定 字段
   * @param {*} label select 选中的label值绑定 字段
   */
  selectLabel (arrs, selectVal, value, label) {
    let arr = []
    arr = arrs
    let obj = {}
    obj = arr.find((item) => {
      return item[value] === selectVal // 比如：选项2
    })
    if (obj !== '' && obj !== undefined) {
      return obj[label] // 获取label的值 0-2000
    }
  },
  /**
   * 为数组添加指定空数据长度
   * @param {*} arr 数组
   * @param {*} length 长度
   */
  addEmptyData (arr, length) {
    // console.log(arr)
    // 20190114 修改i<length   为i<6
    for (let i = 0; i < 6; i++) {
      for (let j = arr[i].length; arr[i].length < length; j++) {
        arr[i][j] = ''
      }
    }
    // 返回显示数组
    // console.log(arr)
    return arr
  },
  /**
   * 手动计算合计
   * @param {*} arr 数组
   * @param {*} labelArr 需要计算合计字段对象数组
   */
  handSum (arr, labelArr) {
    let rt = {}
    for (let i = 0; i < labelArr.length; i++) {
      rt[labelArr[i]] = ''
      for (let j = 0; j < arr.length; j++) {
        // eslint-disable-next-line no-prototype-builtins
        if (arr[j].hasOwnProperty(labelArr[i])) {
          rt[labelArr[i]] = znk.AddFun(rt[labelArr[i]], arr[j][labelArr[i]] || 0)
        } else {
          console.warn(labelArr[i] + '字段不存在！')
        }
      }
    }
    return rt
  },
  /**
   *删除对象中特定字段
   * @param {*} param 对象
   * @param {*} arr 字段数组
   */
  deleteLabel (param, arr) {
    for (let item in arr) {
      if (param) {
        delete param[arr[item]]
      } else {
        console.warn('deleteLabel函数参数parma对象不存在')
      }
    }
    return param
  },
  /**
   *获取cookie
   * @param {*} name
   * @returns
   */
  getCookie (name) {
    var arr = null
    var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
    // eslint-disable-next-line no-cond-assign
    if (arr = document.cookie.match(reg)) {
      return (arr[2])
    } else {
      return null
    }
  },
  /**
   *设置cookie,增加到vue实例方便全局调用
   * @param {*} cname
   * @param {*} value
   * @param {*} expiredays 过期时间
   */
  setCookie (cname, value, expiredays, path) {
    var exdate = new Date()
    exdate.setDate(exdate.getDate() + expiredays)
    document.cookie = cname + '=' + escape(value) + ((path) ? (';path=' + path) : ';path=/') + ((expiredays == null) ? '' : ';expires=' + exdate.toGMTString()) + (process.env.NODE_ENV === 'development' ? '' : ';domain=.fuxintianxia.com')
  },
  /**
   *删除cookie
   * @param {*} name
   */
  delCookie (name) {
    var exp = new Date()
    exp.setTime(exp.getTime() - 1)
    var cval = znk.getCookie(name)
    if (cval != null) {
      document.cookie = name + '=' + cval + ';domain=.fuxintianxia.com;expires=' + exp.toGMTString()
      if (process.env.NODE_ENV === 'development') {
        document.cookie = name + '=' + cval + ';expires=' + exp.toGMTString()
      }
    }
  },
  /**
   *金额大写转换
   */
  DX (n) {
    // n
    if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) {
      return '数据非法'
    }
    var unit = '千百拾亿千百拾万千百拾元角分'
    var str = ''
    n += '00'
    var p = n.indexOf('.')
    if (p >= 0) {
      n = n.substring(0, p) + n.substr(p + 1, 2)
    }
    unit = unit.substr(unit.length - n.length)
    for (var i = 0; i < n.length; i++) {
      str += '零壹贰叁肆伍陆柒捌玖'.charAt(n.charAt(i)) + unit.charAt(i)
    }
    return str.replace(/零(千|百|拾|角)/g, '零').replace(/(零)+/g, '零').replace(/零(万|亿|元)/g, '$1').replace(/(亿)万|壹(拾)/g, '$1$2').replace(/^元零?|零分/g, '').replace(/元$/g, '元整')
  },
  /**
   *数字转换金额格式化
   *设置type 不带小数位(默认是有小数位)
   */
  formatMoney (s, type) {
    s = s * 10000
    // eslint-disable-next-line no-useless-escape
    if (/[^0-9\.]/.test(s)) {
      return '0'
    }
    if (s == null || s === '') {
      return '0'
    }
    s = s.toString().replace(/^(\d*)$/, '$1.')
    s = (s + '00').replace(/(\d*\.\d\d)\d*/, '$1')
    s = s.replace('.', ',')
    var re = /(\d)(\d{3},)/
    while (re.test(s)) {
      s = s.replace(re, '$1,$2')
    }
    s = s.replace(/,(\d\d)$/, '.$1')
    if (type === 0) {
      var a = s.split('.')
      if (a[1] === '00') {
        s = a[0]
      }
    }
    return s + ' 元'
  },
  /*
   *打印时间拆分
   */
  splitTime (time) {
    // eslint-disable-next-line no-useless-escape
    var timearr = time.replace(' ', ':').replace(/\:/g, '-').split('-')
    return timearr
  },
  Throttle (fn, t) {
    let last
    let timer
    let interval = t || 500
    return function () {
      let args = arguments
      let now = +new Date()
      if (last && now - last < interval) {
        clearTimeout(timer)
        timer = setTimeout(() => {
          last = now
          fn.apply(this, args)
        }, interval)
      } else {
        last = now
        fn.apply(this, args)
      }
    }
  },
  isEmpty (val) {
    if (val && val.length > 0) {
      return false
    } else {
      return true
    }
  },
  /**
   * 日期解析，字符串转日期
   * @param dateString 可以为2017-02-16，2017/02/16，2017.02.16
   * @returns {Date} 返回对应的日期对象
   */
  dateParse (dateString) {
    var SEPARATOR_BAR = '-'
    var SEPARATOR_SLASH = '/'
    var SEPARATOR_DOT = '.'
    var dateArray
    if (dateString.indexOf(SEPARATOR_BAR) > -1) {
      dateArray = dateString.split(SEPARATOR_BAR)
    } else if (dateString.indexOf(SEPARATOR_SLASH) > -1) {
      dateArray = dateString.split(SEPARATOR_SLASH)
    } else {
      dateArray = dateString.split(SEPARATOR_DOT)
    }
    return new Date(dateArray[0], dateArray[1] - 1, dateArray[2])
  },

  /**
   * 日期时间比较大小
   * compareDateString大于dateString，返回1；
   * 等于返回0；
   * compareDateString小于dateString，返回-1
   * @param dateString 日期 yyyy-MM-dd
   * @param compareDateString 比较的日期 yyyy-MM-dd
   */
  dateTimeCompare (dateString, compareDateString) {
    if (znk.isEmpty(dateString)) {
      console.warn('dateString不能为空')
      return
    }
    if (znk.isEmpty(compareDateString)) {
      console.warn('compareDateString不能为空')
      return
    }
    // eslint-disable-next-line no-useless-escape
    var dateTime = new Date(dateString.replace(/\-/g, '\/')).getTime()
    // var compareDateTime = znk.dateParse(compareDateString).getTime()
    // eslint-disable-next-line no-useless-escape
    var compareDateTime = new Date(compareDateString.replace(/\-/g, '\/')).getTime()
    if (compareDateTime > dateTime) {
      return 1
    } else if (compareDateTime === dateTime) {
      return 0
    } else {
      return -1
    }
  },
  /**
   * 日期比较大小
   * compareDateString大于dateString，返回1；
   * 等于返回0；
   * compareDateString小于dateString，返回-1
   * @param dateString 日期
   * @param compareDateString 比较的日期
   */
  dateCompare (dateString, compareDateString) {
    if (znk.isEmpty(dateString)) {
      console.warn('dateString不能为空')
      return
    }
    if (znk.isEmpty(compareDateString)) {
      console.warn('compareDateString不能为空')
      return
    }
    var dateTime = znk.dateParse(dateString).getTime()
    var compareDateTime = znk.dateParse(compareDateString).getTime()
    if (compareDateTime > dateTime) {
      return 1
    } else if (compareDateTime === dateTime) {
      return 0
    } else {
      return -1
    }
  },

  /**
   * 判断日期是否在区间内，在区间内返回true，否返回false
   * @param dateString 日期字符串
   * @param startDateString 区间开始日期字符串
   * @param endDateString 区间结束日期字符串
   * @returns {Number}
   */
  isDateBetween (dateString, startDateString, endDateString) {
    if (znk.isEmpty(dateString)) {
      console.warn('dateString不能为空')
      return
    }
    if (znk.isEmpty(startDateString)) {
      console.warn('startDateString不能为空')
      return
    }
    if (znk.isEmpty(endDateString)) {
      console.warn('endDateString不能为空')
      return
    }
    var flag = false
    var startFlag = (znk.dateCompare(dateString, startDateString) < 1)
    var endFlag = (znk.dateCompare(dateString, endDateString) > -1)
    if (startFlag && endFlag) {
      flag = true
    }
    return flag
  },

  /**
   * 判断日期区间[startDateCompareString,endDateCompareString]是否完全在别的日期区间内[startDateString,endDateString]
   * 即[startDateString,endDateString]区间是否完全包含了[startDateCompareString,endDateCompareString]区间
   * 在区间内返回true，否返回false
   * @param startDateString 新选择的开始日期，如输入框的开始日期
   * @param endDateString 新选择的结束日期，如输入框的结束日期
   * @param startDateCompareString 比较的开始日期
   * @param endDateCompareString 比较的结束日期
   * @returns {Boolean}
   */
  isDatesBetween (startDateString, endDateString,
    startDateCompareString, endDateCompareString) {
    if (znk.isEmpty(startDateString)) {
      console.warn('startDateString不能为空')
      return
    }
    if (znk.isEmpty(endDateString)) {
      console.warn('endDateString不能为空')
      return
    }
    if (znk.isEmpty(startDateCompareString)) {
      console.warn('startDateCompareString不能为空')
      return
    }
    if (znk.isEmpty(endDateCompareString)) {
      console.warn('endDateCompareString不能为空')
      return
    }
    var flag = false
    var startFlag = (znk.dateCompare(startDateCompareString, startDateString) < 1)
    var endFlag = (znk.dateCompare(endDateCompareString, endDateString) > -1)
    if (startFlag && endFlag) {
      flag = true
    }
    return flag
  },
  resetForm (that, formName) {
    if (formName && that.$refs[formName]) {
      that.$refs[formName].resetFields()
    }
  },
  // 手机
  isPhone (rules, value, callback) {
    // let el = /^1[3|4|6|7|5|8][0-9]\d{8}$/.test(val)
    if (!value) {
      callback(new Error('手机号码不能为空'))
    } else {
      callback()
    }
  },
  // 固话验证
  telephone (rules, value, callback) {
    let el = !/^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/.test(value)
    if (value === '') {
      callback(new Error('电话号码不能为空'))
    } else if (!el) {
      callback(new Error('电话号码格式不正确'))
    } else {
      callback()
    }
  },
  // 手机号或者固定电话  jxh
  isPhoneOrTelephone (rules, value, callback) {
    let el = !/^(\(\d{3,4}\)|\d{3,4}(-|\s)?)?\d{7,11}$/.test(value) && !/^1[3|4|7|5|6|8][0-9]\d{8}$/.test(value)
    if (value === '') {
      callback(new Error('电话号码不能为空'))
    } else if (el) {
      callback(new Error('电话号码格式不正确'))
    } else {
      callback()
    }
  },
  // 中文
  isChinese (value) {
    return /[\u4e00-\u9fa5]/.test(value)
  },
  // 中文姓名
  isChineseUser (value) {
    return /[^\u4E00-\u9FA5]/g.test(value)
  },
  // 全数字
  isNum (value) {
    return /^[0-9]\d*$/.test(value)
  },
  // 全英文
  isEng (value) {
    return /^[a-zA-Z]*$/.test(value)
  },
  // 身份证
  isIdCard (value) {
    return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(value.toUpperCase())
  },
  // 英文、数字、汉字
  isUserName (value) {
    return /^[a-zA-Z0-9\u4E00-\u9FA5]+$/.test(value)
  },
  // 英文、数字、下划线
  isNickName (rules, value, callback) {
    var el = znk.isUserName(value)
    if (!value) {
      callback(new Error('姓名不能为空'))
    } else if (!el) {
      callback(new Error('姓名格式不正确'))
    } else {
      callback()
    }
  },
  // 英文、数字、下划线
  isUserName2 (rules, value, callback) {
    let val = znk.trim(value)
    var el = /^\w+$/.test(val)
    if (!value) {
      callback(new Error('用户名不能为空'))
      // } else if (value.length < 2) {
      //   callback(new Error('用户名长度必须大于2'))
    } else if (!el) {
      callback(new Error('用户名格式英文、数字、下划线'))
    } else {
      callback()
    }
  },
  // 英文、数字
  isPwd (value) {
    return /^[a-zA-Z0-9\u4E00-\u9FA5]+$/.test(value)
  },
  // 8-18 数字加字母
  isPwd02 (value) {
    return /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,18}$/.test(value)
  },

  pwd2 (rules, value, callback) {
    var el = znk.isPwd02(value)
    if (!value) {
      callback(new Error('密码不能为空'))
    } else if (value.length < 8) {
      callback(new Error('密码长度必须大于8位'))
    } else if (!el) {
      callback(new Error('密码大于8位字母数字组合'))
    } else {
      callback()
    }
  },
  // 字符串转日期格式，strDate要转为日期格式的字符串
  getLocalTime (nS) {
    return new Date(parseInt(nS) * 1000).toLocaleString().substr(0, 17)
  },
  // alert(getLocalTime(1293072805));
  // 整数，小数
  isNumPoint (value) {
    return /^[0-9]+([.]{1}[0-9]+){0,1}$/.test(value)
  },
  checkisNumPoint (rules, value, callback) {
    var el = znk.isNumPoint(value)
    if (!el) {
      callback(new Error())
    } else {
      callback()
    }
  },
  // 身份证
  isIdCards (idCard) {
    // 15位和18位身份证号码的正则表达式
    var regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
    // 如果通过该验证，说明身份证格式正确，但准确性还需计算
    if (regIdCard.test(idCard)) {
      if (idCard.length === 18) {
        // eslint-disable-next-line no-array-constructor
        var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) // 将前17位加权因子保存在数组里
        // eslint-disable-next-line no-array-constructor
        var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2) // 这是除以11后，可能产生的11位余数、验证码，也保存成数组
        var idCardWiSum = 0 // 用来保存前17位各自乖以加权因子后的总和
        for (var i = 0; i < 17; i++) {
          idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i]
        }
        var idCardMod = idCardWiSum % 11 // 计算出校验码所在数组的位置
        var idCardLast = idCard.substring(17) // 得到最后一位身份证号码
        // 如果等于2，则说明校验码是10，身份证号码最后一位应该是X
        if (idCardMod === 2) {
          if (idCardLast === 'X' || idCardLast === 'x') {
            return true
          } else {
            return false
          }
        } else {
          // 用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
          if (idCardLast === idCardY[idCardMod]) {
            return true
          } else {
            return false
          }
        }
      }
    } else {
      return false
    }
    return true
  },
  /**
   * 邮件
   */
  isEmail (rules, value, callback) {
    // eslint-disable-next-line no-useless-escape
    var el = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value)
    if (!value) {
      callback()
    } else if (!el) {
      callback(new Error('邮箱格式不正确'))
    } else {
      callback()
    }
  },
  // /**
  //  * 密码设置确认
  //  * yxf
  //  */
  // password (rule, value, callback) {
  //   let that = store.state.that
  //   if (!value) {
  //     callback(new Error('请输入密码'))
  //   } else if (value.length < 8) {
  //     callback(new Error('密码长度必须大于8'))
  //   } else {
  //     if (that.addForm.checkpwd !== '') {
  //       that.$refs.addForm.validateField('checkPass')
  //     }
  //     callback()
  //   }
  // },
  // checkpwd (rule, value, callback) {
  //   let that = store.state.that
  //   if (!value) {
  //     callback(new Error('请输入确认密码'))
  //   } else if (value.length < 8) {
  //     callback(new Error('密码长度必须大于8'))
  //   } else if (value !== that.addForm.password) {
  //     callback(new Error('两次输入密码不一致!'))
  //   } else {
  //     callback()
  //   }
  // },
  /**
   * 根据数据字典获取指定code数据
   * @param data 数据字典
   * @param codeName 数据字典标时
   * @returns {json}
   */
  dict (data, codeName) {
    let dict = []
    let dictJson = {}
    for (var i = 0; i < data.length; i++) {
      if (data[i].typeCode === codeName && typeof (codeName) === 'string') {
        dict.push(data[i])
      } else if (typeof (codeName) === 'object') {
        for (var j = 0; j < codeName.length; j++) {
          if (data[i].typeCode === codeName[j]) {
            if (typeof (dictJson[codeName[j]]) !== 'object') {
              dictJson[codeName[j]] = []
            }
            dictJson[codeName[j]].push(data[i])
          }
        }
      }
    }
    return typeof (codeName) === 'string' ? dict : dictJson
  },
  // isCountry: function (rules, value, callback) {
  //   let that = store.state.that
  //   if (!that.$store.state.pro) {
  //     callback(new Error('请选择省！'))
  //   } else if (!that.$store.state.city) {
  //     callback(new Error('请选择市！'))
  //   } else if (!that.$store.state.country && that.$store.state.pro !== '台湾省') {
  //     callback(new Error('请选择区！'))
  //   } else {
  //     callback()
  //   }
  // },
  // 获取前后N天的时间
  getDay: function (day) {
    var today = new Date()

    var targetdayMilliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day

    today.setTime(targetdayMilliseconds) // 注意，这行是关键代码

    var tYear = today.getFullYear()

    var tMonth = today.getMonth()

    var tDate = today.getDate()

    tMonth = znk.doHandleMonth(tMonth + 1)

    tDate = znk.doHandleMonth(tDate)

    return tYear + '-' + tMonth + '-' + tDate
  },
  // 获取上一月的时间最后一天
  getLastMonthLastDay: function () {
    var today = new Date()
    var tYear = today.getFullYear()

    var tMonth = today.getMonth()
    tMonth = ((tMonth === 0) ? (12) : (tMonth))

    // var tDate = today.getDate()

    var myDate = new Date(tYear, tMonth, 0)

    return tYear + '-' + tMonth + '-' + myDate.getDate()
  },
  // 获取上一月的时间第一天
  getLastMonthFirstDay: function () {
    var today = new Date()
    var tYear = today.getFullYear()
    var tMonth = today.getMonth()
    tMonth = ((tMonth === 0) ? (12) : (tMonth))
    return tYear + '-' + tMonth + '-01'
  },
  doHandleMonth: function (month) {
    var m = month

    if (month.toString().length === 1) {
      m = '0' + month
    }
    return m
  },
  // 回车事件
  keyupSubmit (callback, $el) {
    let el = $el || document.querySelector('.el-form')
    if (el) {
      el.onkeydown = () => {
        let _key = window.event.keyCode
        if (_key === 13) {
          if (callback) {
            callback()
          }
        }
      }
    }
  },
  //  去掉空格
  trim (str) {
    if (str) {
      str = str.replace(/^\s+/, '')
      for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
          str = str.substring(0, i + 1)
          break
        }
      }
    }
    return str
  },
  /**
   * json数组去重
   * @param arr json
   * @returns {json}
   */
  jsonUnique (arr) {
    if (arr.length <= 0) {
      return {
        unique: false
      }
    }
    let newVal = new Set()
    let newValJson = new Set()
    arr.map(v => {
      newVal.add(JSON.stringify(v))
    })
    newValJson = Array.from(newVal)
    newValJson.forEach((item, key) => {
      newValJson[key] = JSON.parse(item)
    })
    // 重复返回false
    if (newVal.size !== arr.length) {
      return {
        newVal: newValJson,
        unique: false
      }
    } else {
      return {
        newVal: newValJson,
        unique: true
      }
    }
  },
  /**
   * 判断两个日期是否在几个月之内
  */
  completeDate (time1, time2, m) {
    var diffyear = time2.getFullYear() - time1.getFullYear()
    var diffmonth = diffyear * 12 + time2.getMonth() - time1.getMonth()
    if (diffmonth < 0) {
      return false
    }

    var diffDay = time2.getDate() - time1.getDate()

    if (diffmonth < m || (diffmonth === m && diffDay <= 0)) {
      if (diffmonth === m && diffDay === 0) {
        var timeA = time1.getHours() * 3600 + 60 * time1.getMinutes() + time1.getSeconds()
        var timeB = time2.getHours() * 3600 + 60 * time2.getMinutes() + time2.getSeconds()
        if (timeB - timeA > 0) {
          return false
        }
      }
      return true
    }
    return false
  },
  /**
   * 获取两个日期之间相差的天数
  */
  getDaysBetween (dateString1, dateString2) {
    var startDate = Date.parse(dateString1)
    var endDate = Date.parse(dateString2)
    var days = (endDate - startDate) / (1 * 24 * 60 * 60 * 1000)
    // alert(days);
    return days
  },
  // 计算两个日期的间隔时间（时间差）精准到时分
  DateDifference (faultDate, completeTime, type) {
    // let d1 = new Date(faultDate);
    // let d2 = new Date(completeTime);
    var stime = new Date(faultDate).getTime()
    var etime = new Date(completeTime).getTime()
    var usedTime = etime - stime // 两个时间戳相差的毫秒数
    var days = Math.floor(usedTime / (24 * 3600 * 1000))
    // 计算出小时数
    var leave1 = usedTime % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数
    var hours = Math.floor(leave1 / (3600 * 1000))
    // 计算相差分钟数
    var leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数
    var minutes = Math.floor(leave2 / (60 * 1000))
    var time = 0
    if (type === 'date') {
      time = days + '天' + hours + '时' + minutes + '分'
    } else {
      time = (hours + (days * 24)) + '时' + minutes + '分'
    }
    return { time: time, hours: (hours + (days * 24)), minutes: minutes, minutesCount: (hours + (days * 24 * 60 * 60)) + (minutes * 60) }
  },
  /**
   * 车牌号
  */
  truckNo (rules, value, callback) {
    var regExp = /(^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$)/
    if (!regExp.test(value)) {
      callback(new Error('车牌号不正确'))
      return false
    } else {
      callback()
      return true
    }
  },

  /**
   * 59分钟
  */
  minute (rules, value, callback) {
    var regExp = /^(([0-9])$|([1-5][0-9])$)/
    if (!regExp.test(Number(value))) {
      callback(new Error('不能大于59分钟'))
      return false
    } else {
      callback()
      return true
    }
  },

  /* 判断里程是否大于0 */
  mileage (rule, value, callback) {
    if (Number(value) <= 0) {
      callback(new Error('里程数必须大于0'))
    } else {
      callback()
    }
  },

  // 防抖
  shake (fn, d) {
    let time = null
    return () => {
      if (time) {
        clearTimeout(time)
      }
      time = setTimeout(fn, d)
    }
  },
  // 节流
  throttle (fn, d) {
    let v = true
    return () => {
      if (!v) {
        return false
      }
      v = false
      setTimeout(() => {
        v = true
        fn()
      }, d)
    }
  },
  // 去除前后逗号
  delcomma (str) {
    return str.replace(/^,+/, '').replace(/,+$/, '')
  },

  // 属性结构处理
  treeJson ({ data, idVal = null, id = 'id', pid = 'pid' }) {
    // console.log('pid', pid)
    // let tree = []
    // 循环迭代解析json

    var itemArr = []
    for (var i = 0; i < data.length; i++) {
      var node = data[i]
      if (node[pid] === '') {
        node[pid] = null
      }
      if (node[pid] === idVal) {
        var newNode = data[i]
        let arr = this.treeJson({ data, idVal: node[id], id: id, pid: pid })
        newNode.children = arr.length > 0 ? arr : null
        itemArr.push(newNode)
      }
    }
    return itemArr
  },
  // 表格合并行处理
  rowColFun ({ list, keys = 'id' }) {
    let arr = []
    list.map((item, key) => {
      let firstIndex = list.findIndex(item2 => {
        return item[keys] === item2[keys] // 当id相同的时候，返回第一个相同的Index 赋值给 firstIndex
      })
      if (arr.findIndex(item3 => {
        return item3.firstIndex === firstIndex
      }) === -1) {
        arr.push({
          length: list.filter(item4 => {
            return item4[keys] === item[keys] // 利用数组的filter方法，过滤出相同id的数组的长度。数组长度-即为跨多少行
          }).length,
          firstIndex: firstIndex // firstIndex 返回的是第一个id就满足的第一个Index,即为rowIndex开始于第几行。
        })
      }
    })
    return arr
  },
  workbook2blob (workbook) {
    // 生成excel的配置项
    var wopts = {
      // 要生成的文件类型
      bookType: 'xlsx',
      // // 是否生成Shared String Table，官方解释是，如果开启生成速度会下降，但在低版本IOS设备上有更好的兼容性
      bookSST: false,
      type: 'binary'
    }
    console.log('workbook', workbook)
    var wbout = XLSX.write(workbook, wopts)
    // 将字符串转ArrayBuffer
    function s2ab (s) {
      var buf = new ArrayBuffer(s.length)
      var view = new Uint8Array(buf)
      for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
      return buf
    }
    let buf = s2ab(wbout)
    var blob = new Blob([buf], {
      type: 'application/octet-stream'
    })
    return blob
  },
  // 将blob对象 创建bloburl,然后用a标签实现弹出下载框
  openDownloadDialog (blob, fileName) {
    if (typeof blob === 'object' && blob instanceof Blob) {
      blob = URL.createObjectURL(blob) // 创建blob地址
    }
    var aLink = document.createElement('a')
    aLink.href = blob
    // HTML5新增的属性，指定保存文件名，可以不要后缀，注意，有时候 file:///模式下不会生效
    aLink.download = fileName || ''
    var event
    if (window.MouseEvent) event = new MouseEvent('click')
    //   移动端
    else {
      event = document.createEvent('MouseEvents')
      event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
    }
    aLink.dispatchEvent(event)
  },
  // excle解析后导出结果
  exportExcel (data = {}, name = '下载模板') {
    var wb = XLSX.utils.book_new()
    for (let item in data) {
      var sheet1 = XLSX.utils.json_to_sheet(data[item])
      // 创建一个新的空的workbook
      XLSX.utils.book_append_sheet(wb, sheet1, item)
    }
    const workbookBlob = znk.workbook2blob(wb)
    znk.openDownloadDialog(workbookBlob, name + '.xlsx')
  },
  isnumber (val) {
    // 正整数
    // val = val.replace(/[^\d]/g, '')
    // 保留2位小数
    val = val.replace(/[^\d.]/g, '').replace(/^0+(\d)/, '$1').replace(/^\./, '0.').match(/^\d*(\.?\d{0,2})/g)[0] || ''
    // 第一位0开头，0后面为数字，则过滤掉，取后面的数字
    // 如果输入的第一位为小数点，则替换成 0. 实现自动补全
    // 最终匹配得到结果 以数字开头，只有一个小数点，而且小数点后面只能有0到2位小数
    return val
  },
  browser () {
    var u = navigator.userAgent
    // var app = navigator.appVersion
    // 判断是否IE内核

    return {
      trident: u.indexOf('Trident') > -1, // IE内核

      presto: u.indexOf('Presto') > -1, // opera内核

      webKit: u.indexOf('AppleWebKit') > -1, // 苹果、谷歌内核

      gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') === -1, // 火狐内核

      mobile: !!u.match(/AppleWebKit.*Mobile.*/), // 是否为移动终端

      ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), // ios终端

      android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, // android终端或者uc浏览器

      iPhone: u.indexOf('iPhone') > -1, // 是否为iPhone或者QQHD浏览器

      iPad: u.indexOf('iPad') > -1, // 是否iPad

      webApp: u.indexOf('Safari') === -1, // 是否web应该程序，没有头部与底部

      weixin: u.indexOf('MicroMessenger') > -1, // 是否微信 (2015-01-22新增)

      qq: u.match(/\sQQ/i) === ' qq' // 是否QQ

    }
  },
  // 系统处理
  goPAGE () {
    if ((navigator.userAgent.match(/(phone|pod|iPhone|ios|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
      /* window.location.href="你的手机版地址"; */
      if ((navigator.userAgent.match(/(iPod|pad|iPad)/i))) {
        return 'pad'
      } else {
        return 'mobile'
      }
    } else {
      /* window.location.href="你的电脑版地址";    */
      return 'pc'
    }
  },
//   getPdf ({ id = '#pdf', title = new Date().getTime() }) {
//     html2Canvas(document.querySelector(id), {
//       allowTaint: true
//     }).then(function (canvas) {
//       let contentWidth = canvas.width
//       let contentHeight = canvas.height
//       let pageHeight = contentWidth / 1190.6 * 1683.8
//       let leftHeight = contentHeight
//       let position = 0
//       let imgWidth = 1190.6
//       let imgHeight = 1190.6 / contentWidth * contentHeight
//       console.log('d', leftHeight, imgWidth, imgHeight)
//       let pageData = canvas.toDataURL('image/jpeg', 1.0)
//       // var img = document.createElement('img')
//       // img.src = pageData
//       // document.body.appendChild(img)
//       let PDF = new JsPDF('', 'pt', 'a2')
//       if (leftHeight < pageHeight) {
//         PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
//       } else {
//         while (leftHeight > 0) {
//           PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
//           leftHeight -= pageHeight
//           position -= 1683.8
//           if (leftHeight > 0) {
//             PDF.addPage()
//           }
//         }
//       }
//       PDF.save(title + '.pdf')
//     }
//     )
//   }
}
export {
  com
}
